package com.mmall.concurrency.example.Singleton;

import com.mmall.concurrency.annoations.NotThreadSafe;

/**
 * 懒汉模式 -》双层同步锁单例模式
 * 单例实例在第一次使用时进行创建
 */
@NotThreadSafe
public class SingleExample4 {

    //私有构造函数
    private SingleExample4(){

    }

    //1 memory = allocate()  分配对象的内存空间
    //2 ctorInstance()  初始化对象
    //3 instance = memory  设置Instance指向刚分配的内存

    // JVM和cpu优化，发生了指令重排

    //1 memory = allocate()  分配对象的内存空间
    //3 instance = memory  设置Instance指向刚分配的内存
    //2 ctorInstance()  初始化对象


    //单例对象
    private static SingleExample4 instance = null;

    //静态工厂方法
    public static SingleExample4 getInstance(){
        if(instance == null){//双层检测机制
            synchronized (SingleExample4.class){//同步锁
                if(instance == null){
                    instance = new SingleExample4();
                }
            }
            instance = new SingleExample4();
        }
        return instance;
    }

}
